#include "type.h"
#include "kernel.h"
#include "hal.h"
#include <stdint.h>
#include <string.h>
#include "kshell.c"
#include "task.c"
// #include "vfs.h"

extern uint64_t init_stack[256];



void init_kthread();


int kernel_main(){
    idt_init();
    init_mem();
    // kthread_t _kinit;
    // ramfs_init();
    // fat32_init(&fat32_fs);
    // overlay_init(&overlay_fs);
    TK_logo();
    // shell();
    init_threads();
    if(do_fork("init",init_kthread,(void*)0, &init_thread, (uint64_t)&(init_stack[255]))==-1) 
        io_printf("init_th falut");
    // io_printf("schedule");
    current_th=&init_thread;
    // __asm__ volatile (
    //     "pushq %%rbp\n"       // 保存当前基址指针
    //     "pushq %%rbx\n"       // 保存当前寄存器
    //     "pushq %%r12\n"
    //     "pushq %%r13\n"
    //     "pushq %%r14\n"
    //     "pushq %%r15\n"
    //     "movq %%rsi, %0\n"   // 加载新栈指针
    //     "popq %%r15\n"         // 恢复新线程的寄存器
    //     "popq %%r14\n"
    //     "popq %%r13\n"
    //     "popq %%r12\n"
    //     "popq %%rbx\n"
    //     "popq %%rbp\n"
    //     "push %1\n"
    //     "ret\n"               // 返回到新线程的 rip 
    //     ::"r"(&init_stack[255]),"r"(&init_kthread));
    while(1){
        // asm volatile ("hlt");
        // for(int i=0;i<=114514;i++) ;
        io_printf("schedule");
        schedule();
    }
}
